perm filename FSTDAC.MAC[COL,LCS] blob
sn#104312 filedate 1974-05-25 generic text, type T, neo UTF8
NUM=↑D8 ;NUMBER OF 128 WORD BLOCKS PER BUFFER
TITLE FSTDAC ;NICHOLAS VITULLI COLGATE U. 1973
EXTERN FNAM,FILBRK ;ROUTINE TO GET INPUT FILE
INTERN DEV ;NAME (DAVID HOFFMAN COLGATE)
SIZE=200*NUM ;TOTAL SIZE OF EACH BUFFER
STATUS=004000 ;INTERRUPTS ON
OFF=0 ;STATUS BITS FOR DAC
DONE=10
BUSY=20
MISS=40
T=1 ;TEMP ACC
I=2 ;ACC TO HOLD RELOCATION FACTOR
SETUP=4 ;ACC USED FOR INITIAL SETUP
DSK=5 ;INPUT CHANNEL
B1=11 ;RELOCATED IOWD FOR BUFFER 1
B2=12 ;RELOCATED IOWD FOR BUFFER 2
IB1=13 ;IOWD FOR BUFFER 1
IB2=14 ;IOWD FOR BUFFER 2
IO=7 ;ACC FOR TTY INPUT
INDEX: 0 ;SAVE RELOCATION FACTOR
SAVET: 0 ;SAVE ACC T DURING INTERRUPT ROUTINE
MFLG: 0 ;FLAG FOR DATA MISSED
DFLG: 0 ;FLAG FOR DONE
TPOINT: 0 ;NEXT IOWD FOR INTERRUPT ROUTINE
WHATBF: 0 ;BUFFER POINTER 0=BUFFER 2 -1=BUFFER 1
INTBLK: 4,INTLOC ;↑C BLOCK
2
0
0
ADD1: 0 ;INTERRUPT ROUTINE
EXCHWD: EXCH I,INDEX ;GET RELOCATION FACTOR AND SAVE I
MOVEM T,SAVET(I) ;SAVE T
SETCMM WHATBF(I) ;POINT WHATBF TO NEXT BUFFER
SKIPN T,TPOINT(I) ;GET NEXT IOWD (RELOCATED)
JRST NODATA(I) ;IF 0 NO IOWD READY
SETZM TPOINT(I) ;ZERO IOWD
MOVEM T,POINTR(I) ;RESTORE BLKO POINTER
RETURN: MOVE T,SAVET(I) ;RESTORE T
EXCH I,INDEX(I) ;RESTORE I AND INDEX
JENWD: JRSTF @ADD1 ;DISMISS INTERRUPT
NODATA: CONSZ 200,MISS ;CHECK FOR DATA MISSED
SETOM MFLG(I) ;YES RAISE MISSED FLAG
CONO 200,OFF ;TURN OFF DAC
SETOM DFLG(I) ;RAISE DONE FLAG
JRST RETURN(I) ;RESTORE AND DISMISS
ADD2: 0 ;APR TRAP (ASSUME NEVER TO GET HERE)
BP1: BLOCK 2 ;IOWD FOR BF1
BP2: BLOCK 2 ;IOWD FOR BF2
POINTR: BLOCK 2 ;IOWD FOR BLKO
RTB: XWD 1,ADD1 ;RTBLK UUO SETUP TO GET ON PI 1.
XWD 1,ADD2 ;FSTBLK MODE
CONSO 200,DONE
BLKO 200,POINTR
0
RTBOFF: BLOCK 4 ;RTBLK UUO SETUP TO GET OFF PI
BF1: BLOCK SIZE ;I/O BUFFER FOR SAMPLES
BF2: BLOCK SIZE ;I/O BUFFER FOR SAMPLES
STRT: RESET
MOVE SETUP,[EXIT] ;DON'T ALLOW RESTART
MOVEM SETUP,STRT
RETRY2: JSA 16,FILBRK ;GET INPUT FILE NAME
INIT DSK,17 ;DUMP MODE INPUT
DEV: 0 ;DEV FILLED BY FILBRK
0
JRST [
OUTSTR [ASCIZ /CAN'T GET INPUT DEVICE?/]
EXIT] ;EXIT ON DEVICE ERROR
SKIPE FNAM ;IF FILE NAME BLANK
JRST LKUP ;SET FILE NAME
MOVE SETUP,['MUSIC '] ;TO MUSIC.MUS
MOVEM SETUP,FNAM
MOVSI SETUP,'MUS'
MOVEM SETUP,FNAM+1
LKUP: LOOKUP DSK,FNAM ;STORAGE FOR FNAME IN FILBRK
JRST [
OUTSTR [ASCIZ /?CAN'T FIND?/]
JRST RETRY2] ;GET NEW NAME ON LOOKUP ERROR
OUTSTR [ASCIZ /MODE? /] ;GET MODE FOR DAC OUTPUT
INCHWL IO ;PUT IN BITS 18+19 OF CONOWD
SUBI IO,60
DPB IO,[POINT 2,CONOWD,19]
CLRBFI ;NO TYPE AHEAD
OUTSTR [ASCIZ /CLOCK? /] ;GET CLOCK RATE
INCHWL IO ;GET SELECT
SUBI IO,60 ;PUT IN BITS 28+29
DPB IO,[POINT 2,CONOWD,29]
INCHWL IO ;GET DIVIDE
SUBI IO,60 ;PUT IN BITS 20,21+22
DPB IO,[POINT 3,CONOWD,22]
CLRBFI
RETRY1: MOVE SETUP,[XWD 1,1] ;LOCK IN CORE
LOCK SETUP, ;ON ANY ERROR TYPE 'L'
JRST [
OUTSTR [ASCIZ /L/]
INCHRS IO
JRST RETRY1
EXIT] ;TRY TO LOCK AGAIN, EXIT FROM RETRY LOOP ON TTY INPUT.
OUTSTR [ASCIZ /
/]
HRRZ SETUP,SETUP ;GET RELOCATION FROM
LSH SETUP,9 ;LOCK UUO (NORMALIZE)
MOVEM SETUP,INDEX ;STORE IN INDEX
ADDM SETUP,EXCHWD ;RELOCATE SOME INSTRUCTIONS
ADDM SETUP,JENWD
MOVE IB1,[IOWD SIZE,BF1] ;CREATE IOWD'S IN ACCS
MOVE IB2,[IOWD SIZE,BF2] ;FOR QUIT RESTORE
MOVEM IB1,BP1 ;SET UP IOWD FOR FIRST READ
MOVEM IB1,POINTR ;CREATE IOWD FOR BLKO
MOVEI SETUP,INTBLK ;GRAB ↑C
MOVEM SETUP,134
MOVEI SETUP,RTB ;EXECUTE RTBLK UUO
RTTRP SETUP,
JRST [
OUTSTR [ASCIZ /?NCH?/]
EXIT] ;EXIT ON ERROR
MOVE B1,POINTR ;GET RELOCATE IOWD FOR BUF1
HRRZ B2,POINTR ;MODIFY FOR BUF2
ADDI B2,SIZE
HLL B2,POINTR
SETZM MFLG ;LOWER MISSED FLAG
SETZM DFLG ;LOWER DONE FLAG
SETZM TPOINT ;ZERO NEXT IOWD
SETZM WHATBF ;POINT WHATBF TO BUFFER 2
MOVEI SETUP,1 ;GET IN HPQ 1
HPQ SETUP, ;(HIGHER THAN NORMAL TIME SHARING)
JRST [
OUTSTR [ASCIZ /?CAN'T HPQ?
/]
JRST XIT+1] ;EXIT GRACEFULLY ON ERROR
IN DSK,BP1 ;FILL FIRST BUFFER FROM DSK
SKIPA
JRST XIT ;ASSUME NULL FILE
CONSZ 200,BUSY ;IS DAC ALREADY ON
OUTSTR [ASCIZ /?DAC IS ON?
/] ;YES TELL USER
CONOWD: CONO 200,STATUS ;START DAC
LOOP:
SKIPE DFLG ;IF DONE FLAG IS RAISED HERE - ERROR
JRST MISSED ;NEXT IOWD WAS NOT READY
SKIPE WHATBF ;WAIT FOR PERMISSION TO FILL BUFFER 2
JRST LOOP
MOVEM IB2,BP2 ;RESTORE INPUT IOWD (NECESSARY FOR MTA)
IN DSK,BP2 ;READ BUFFER
SKIPA
JRST X1 ;AT EOF WAIT FOR DONE FLAG
MOVEM B2,TPOINT ;RESTORE NEXT IOWD
LOOP1: SKIPE DFLG ;SAME AS ABOVE BUT FOR BUFFER 1
JRST MISSED
SKIPL WHATBF
JRST LOOP1
MOVEM IB1,BP1
IN DSK,BP1
SKIPA
JRST X1
MOVEM B1,TPOINT
JRST LOOP
MISSED: OUTSTR [ASCIZ /
?COULD NOT READ INPUT FAST ENOUGH?
/] ;NO NEXT POINTER, THE DONE FLAG WAS RAISED BUT MORE SAMPLES EXISTED.
X1: SKIPL DFLG ;WAIT FOR DONE FLAG -- ALL SAMPLES READ
JRST .-1
SKIPE MFLG ;WAS DATA MISSED (SET IN INTERRUPT ROUTINE)
OUTSTR [ASCIZ /?DATA MISSED?
/] ;YES -- TELL USER
SKIPA
XIT: OUTSTR [ASCIZ /?NULL FILE?/] ;TELL USER EOF ON FIRST READ
MOVEI SETUP,RTBOFF ;GET OFF PI
RTTRP SETUP,
JFCL ;IGNORE ANY ERROR
MOVE SETUP,[XWD 1,1] ;UNLOCK
UNLOK. SETUP,
JFCL ;IGNORE ANY ERRORS
MOVEI SETUP,0
HPQ SETUP, ;GET BACK TO TIMESHARING LEVEL
JFCL ;IGNORE ANY ERRORS
EXIT ;SAY HELLO TO MONITOR
INTLOC: CONO 200,OFF ;HERE ON ↑C -- TURN OF DEVICE
JRST XIT+1 ;EXIT GRACEFULLY
END STRT